package com.zenithmind.version.pojo.dto;

import com.zenithmind.version.pojo.dto.base.BaseDTO;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 仓库基本信息DTO - 遵循单一职责原则，只包含仓库基本信息
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Schema(description = "仓库基本信息DTO")
public class RepositoryBasicInfoDTO extends BaseDTO {

    /**
     * 仓库名称
     */
    @NotBlank(message = "仓库名称不能为空")
    @Size(min = 1, max = 100, message = "仓库名称长度必须在1-100之间")
    @Pattern(regexp = "^[a-zA-Z0-9_][a-zA-Z0-9_-]*[a-zA-Z0-9_]$|^[a-zA-Z0-9_]$", 
             message = "仓库名称只能包含字母、数字、下划线和连字符，不能以连字符开头或结尾")
    @Schema(description = "仓库名称", example = "my-project")
    private String name;

    /**
     * 仓库描述
     */
    @Size(max = 500, message = "仓库描述长度不能超过500")
    @Schema(description = "仓库描述", example = "这是一个示例项目")
    private String description;

    /**
     * 仓库类型（1-公开，2-私有，3-内部）
     */
    @NotNull(message = "仓库类型不能为空")
    @Schema(description = "仓库类型（1-公开，2-私有，3-内部）", example = "1")
    private Integer type;

    /**
     * 默认分支
     */
    @Pattern(regexp = "^[a-zA-Z0-9_][a-zA-Z0-9_/-]*[a-zA-Z0-9_]$|^[a-zA-Z0-9_]$", 
             message = "分支名称格式不正确")
    @Schema(description = "默认分支", example = "main")
    private String defaultBranch = "main";

    /**
     * 仓库语言
     */
    @Size(max = 50, message = "仓库语言长度不能超过50")
    @Schema(description = "仓库语言", example = "Java")
    private String language;

    /**
     * 检查是否为公开仓库
     * 
     * @return 是否为公开仓库
     */
    public boolean isPublic() {
        return Integer.valueOf(1).equals(this.type);
    }

    /**
     * 检查是否为私有仓库
     * 
     * @return 是否为私有仓库
     */
    public boolean isPrivate() {
        return Integer.valueOf(2).equals(this.type);
    }

    /**
     * 检查是否为内部仓库
     * 
     * @return 是否为内部仓库
     */
    public boolean isInternal() {
        return Integer.valueOf(3).equals(this.type);
    }

    /**
     * 获取类型描述
     * 
     * @return 类型描述
     */
    public String getTypeDescription() {
        return switch (type) {
            case 1 -> "公开";
            case 2 -> "私有";
            case 3 -> "内部";
            default -> "未知";
        };
    }
}
